我們透過這個簡易庫存系統的案例,帶大家建置一個簡單的FastAPI專案。
下圖為此系統的資料庫規劃 :
我們會使用到3個表,顧客、訂單、產品三張表。
我們會根據這三張表來用FastAPI實作一些商業邏輯的操作,那當然目前的規劃都只是暫時性的,會根據實際上的需求而新增修改欄位,目前先讓大家有個概念即可。
在使用 FastAPI 進行應用程式建置時,我們通常會使用 ORM 與 DB 進行溝通。
ORM是一種可以將物件和資料庫進行對應的技術,可以理解成說程式與DB中間多了一層翻譯人員,ORM會將程式碼轉換成SQL語言再去DB進行查詢。
轉自 ORM 的核心概念:它不是SQL的替代品,也不可能替代SQL | 小朱® 的技術隨手寫 - 點部落 (dotblogs.com.tw)
使用ORM進行資料庫操作時可以不用擔心 SQL injection 的攻擊,也能使遷移資料庫時更加方便,不用擔心各個資料庫的語法差異。
但也不是說只學ORM技術便不用學SQL語言了,再一些複雜的查詢情況下,使用原生SQL進行查詢的效益會遠大於使用ORM。
更別說如果SQL語言不熟練,後續該如何去優化你的查詢效能呢?
SQLAlchemy 是一個 Python的開源ORM套件,我們在使用 FastAPI 時可以搭配此套件與 DB 進行溝通操作。
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Movie(Base):
__tablename__ = 'movies'
id = Column(Integer, primary_key=True)
title = Column(String(255), nullable=False)
year = Column(Integer)
directed_by = Column(Integer, ForeignKey('directors.id'))
我們可以透過這種形式的定義,來完成資料表的對應,若是從DB獲取查詢資料回來時,便會是這種類型的物件。
Alembic 是搭配 SQLAlchemy 使用的資料庫遷移工具,使用 Alembic 就可以將上一小節範例中定義的物件,轉換成如下範例的資料庫遷移檔:
"""create account table
Revision ID: 1975ea83b712
Revises:
Create Date: 2011-11-08 11:40:27.089406
"""
# revision identifiers, used by Alembic.
revision = '1975ea83b712'
down_revision = None
branch_labels = None
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table(
'account',
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String(50), nullable=False),
sa.Column('description', sa.Unicode(200)),
)
def downgrade():
op.drop_table('account')
製作完遷移檔之後,便可以使用 Alembic 將遷移檔內對資料庫的更動同步到目標資料庫中,也可以降低版本回到上一個遷移檔的狀態,以實現資料庫的版本管理。
在下一章節,我們將會使用 SQLAlchemy 定義好資料庫物件,在使用 Alembic 建立遷移檔並同步到目標資料庫中。
ORM 的核心概念:它不是SQL的替代品,也不可能替代SQL | 小朱® 的技術隨手寫 - 點部落 (dotblogs.com.tw)